ItIron2021
Javascript
昨天我們打開了非同步的大門,今天我們要繼續探討與其有關的題目,忍耐一下! 這個主題會一路延續到Day24,趁這段時間把非同步相關的題目搞清楚吧!
請你簡單解釋什麼是promise
再忙..也要來張防雷圖
又是一個讓新手聞風喪膽的東西,不過坦白說多摸幾次就會知道這並不真的這麼可怕,所謂的promise就是一個會在未來某個時間點回傳某個數值的物件,也就是一個非同步的值(async value)。而一個promise只會有以下三種狀態
進入範例前我們先做個簡單的比喻,你今天打開熊貓人點了一份午餐,熊貓平台收到你的訂單並承諾(promise pending)你10-15分鐘後會收到你的餐點,若一切順利,在15分鐘後你確實收到了餐點(promise fulfilled),但萬一訂單被取消了,你收到的就只有失望(promise rejected)。另外,一旦promise被fullfilled或是rejected,這個promise就功成身退了,有個專有名詞叫settled(after a promise being fulfilled or rejected,the promise is said to be settled)
了解基本概念後,接著你要知道要如何寫出一個基本的prmoise
const p = new Promise((resolve, reject) => {
if (滿足某些條件) {
resolve('某個A值');
} else if (滿足另一些條件) {
resolve('某個B值')
} else {
reject('某個C值')
}
})
Promoise建構子中你需要傳入一個函數(稱作該promise的excuter),這函數需要傳入兩個參數,一般來說我們會照慣例命名為resolve & reject兩個參數,分別決定fulfilled或rejected時,最終要回傳什麼值。
注意一下,我剛剛的示範中寫了不只一個resolve,很多時候你需要根據不同的情況決定要回傳什麼樣的resolve/reject值,因此一個promise內是可以存在複數個不同的情況的,但注意一旦回傳了值(也就是使用了resolve/reject後),整個promise就結束了(settled),後續的程式碼便不會再執行。
而這個promise在使用時可以藉由原生的**.then方法去取得resolved後的值**、藉由**.catch方法去取得rejected的值**,看一個簡單的例子吧!
const p1 = new Promise((resolve, reject) => {
resolve('看屁看')
})
const p2 = new Promise((resolve, reject) => {
reject('邱喔')
})
p1.then(value => {
console.log(value) //看屁看
})
p2.catch(value => {
console.log(value) //邱喔
})
以上是很基本的promise說明,一般你在請求API時收到的都是promise物件,你再根據請求成功或失敗決定你要如何運用回傳的值,我知道這篇其實很簡略,但就像我不斷強調的,解釋名詞並不是我的目的,在進入明天的單元之前,強烈建議再透過其他資源去增加你對promise的熟練度!
promise
本文章同步發布於個人部落格,有興趣的朋友也可以來逛逛~!